package com.crk.util;

import java.security.MessageDigest;

public class MD5 {
    public static String encrytMD5(String data){
        try{
            //指定加密算法
            MessageDigest digest=MessageDigest.getInstance("MD5");
            digest.update(data.getBytes());
            return encryptMD5toString(digest.digest());
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    //将加密后的字节数组转化为固定长度的字符串
    private static String encryptMD5toString(byte[] data){
        try{
            String str="";
            String str16;
            for(int i=0;i<data.length;i++){
                //转换为16进制数据
                //Integer.toHexString的参数是int，如果不进行&0xff，那么当一个byte会转换成int时，由于int是32位，而byte只有8位这时会进行补位，
                //例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊，呵呵！即0xffffffff但是这个数是不对的，这种补位就会造成误差。
                //和0xff相与后，高24比特就会被清0了，结果就对了。
                str16=Integer.toHexString(0xFF & data[i]);
                if(str16.length()==1){
                    str=str+"0"+str16;
                }else{
                    str=str+str16;
                }
            }
            return str;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}
